# 尾递归
# 尾递归是指，在函数返回的时候，调用自身本身，并且，return语句不能包含表达式。
# 大多数编程语言没有针对尾递归做优化，Python解释器也没有做优化，所以，即使把上面的fact(n)函数改成尾递归方式，也会导致栈溢出。
def fact(n):
    return fact_iter(n, 1)

def fact_iter(num, product):
    if num == 1:
        return product
    return fact_iter(num-1, num * product)

# 使用递归函数的优点是逻辑简单清晰，缺点是过深的调用会导致栈溢出。

# 针对尾递归优化的语言可以通过尾递归防止栈溢出。尾递归事实上和循环是等价的，没有循环语句的编程语言只能通过尾递归实现循环。

# Python标准的解释器没有针对尾递归做优化，任何递归函数都存在栈溢出的问题。